"""
思路：需要做分支判断：
* 如果是函数【有括号()】： 得到占位符里的函数，调用函数并执行函数，生成数据，存到环境变量里 ==新加的分支方法
  - 如果是函数： 首先调用函数 得到生成数据
  - 把生成数据存到环境变量里 用于后续的调用 -- 属性名 ，属性值
  - 把数据原本占位符替换成自己生成的数据- 手机号 用户名

* 如果是变量【没有()】： 那么就直接从环境变量里获取属性 替换就可以了；--老方法 不用改
"""

import re

import allure
from loguru import logger

from data.envi_data import EnviData
from tools.handle_gendata import GenData

@allure.step("替换数据")
def replace_mark(str_data):
    if str_data is None:
        logger.info("数据为空，不需要替换操作！")
        return
    result = re.findall("#(.*?)#", str_data)
    logger.info(f"正则查询的结果是:{result}")
    logger.info(f"原始字符串是：{str_data}")

    if result:
        logger.info("==========开始替换数据==============")
        for mark in result:
            logger.info(f"mark是{mark}")
            # 对mark进行判断
            if "()" in mark:
                gen_data = eval(f"GenData().{mark}") #mark是函数名
                fun_name = mark.strip("()")
                setattr(EnviData,fun_name,gen_data)
                logger.info(f"设置生成数据到环境变量后:{EnviData.__dict__}")
                str_data = str_data.replace(f"#{mark}#",str(gen_data))
            else:
                if hasattr(EnviData, mark):
                    value = getattr(EnviData, mark)
                    logger.info(f"得到属性值是：{value}")
                    str_data = str_data.replace(f"#{mark}#", str(value))
    else:
        logger.info("没有要替换的数据！")
    logger.info(f"替换完成之后的字符串是{str_data}")
    logger.info(f"提取并设置环境变量后的类属性为:{EnviData.__dict__}")
    return str_data


# if __name__ == '__main__':
#     class EnviData:
#         prodId = 123
#         skuId = 456
#     str_data = '{"basketId": 0, "count": 1, "prodId": #prodId#, "shopId": 1, "skuId": #skuId#}'
#     print(replace_mark(str_data))

if __name__ == '__main__':
    class EnviData:
        mobile = 123
    str_data = '{"mobile":"#gen_unregister_phone()#"}'
    print(replace_mark(str_data))